package com.wjw.java.others.wrapper_;


/**
 * 八大包装类：
 * ---------------------------------------------------
 * 下面六个包装类,都继承了Number类,实现了Comparable、Serializable接口
 * byte -> Byte：
 * shrot -> Short：
 * int -> Integer：
 * long -> Long：
 * float -> Float：
 * double -> Double：
 * ---------------------------------------------------
 * 下面两个包装类,都继承了Object类,实现了Comparable、Serializable接口
 * char -> Character
 * boolean -> Boolean
 * ---------------------------------------------------
 * 装箱：基本数据类型转为包装类
 * 拆箱：包装类转为基本数据类型
 * jdk1.5之前,需要手动的装箱和拆箱
 * jdk1.5之后(包含jdk1.5),都是自动装箱和拆箱
 * 自动装箱底层调用的是valueOf()方法,比较Integer.valueOf()
 * ---------------------------------------------------
 * Integer x = 数值;//底层会调用Integer.valueOf()
 * 数值在：-128 ~ 127之间直接从缓存中取,所以两个值相同的Integer对象地址一致
 * 数值不在：-128 ~ 127这个范围内的值,则会new Integer(),所以两个值相同的Integer对象地址不一致
 *
 * 所以：
 * Integer a = 1000;//底层会调用Integer.valueOf()
 * Integer b = 1000;//底层会调用Integer.valueOf()
 * System.out.println(a == b);//为false
 * ---------------------------------------------------
 */
public class WrapperTypes{
    public static void main(String[] args) {
        //-----------------------jdk1.5之前-----------------------
        //手动装箱：int -> Integer
        int number1 = 100;
        Integer integer1 = new Integer(number1);//方式1
        Integer integer2 = Integer.valueOf(number1);//方式2
        //手动拆箱：Integer -> int
        int i1 = integer1.intValue();
        int i2 = integer2.intValue();

        //-----------------------jdk1.5之后-----------------------
        int number2 = 200;
        //自动装箱：int -> Integer
        Integer integer3 = number2;//底层会调用Integer.valueOf()
        //自动拆箱：Integer -> int
        int number3 = integer3;//底层会调用intValue();

        /**
         *-----------------------Integer面试题-----------------------
         * Integer对象-128 ~ 127之间直接从缓存中取,所以两个值相同的Integer对象地址一致
         * 不在这个范围内的值,则会new Integer(),所以两个值相同的Integer对象地址不一致
         */
        Integer a1 = -128;//底层会调用Integer.valueOf()
        Integer a2 = -128;//底层会调用Integer.valueOf()
        System.out.println(a1 == a2);//true

        Integer b1 = 127;//底层会调用Integer.valueOf()
        Integer b2 = 127;//底层会调用Integer.valueOf()
        System.out.println(b1 == b2);//true

        Integer c1 = 128;//底层会调用Integer.valueOf()
        Integer c2 = 128;//底层会调用Integer.valueOf()
        System.out.println(c1 == c2);//false

        Integer d1 = new Integer(1);//new出来的,在堆中的内存地址就不一样
        Integer d2 = new Integer(2);//new出来的,在堆中的内存地址就不一样
        System.out.println(d1 == d2);//false
        //-----------------------包装类和String直间的转换-----------------------
        Integer number4 = 400;
        //Integer -> String
        String s1 = number4 + "";//方式1
        String s2 = number4.toString();//方式2
        String s3 = String.valueOf(number4);//方式3

        //String -> Integer
        String str = "123456";
        Integer e1 = Integer.parseInt(str);//方式1,使用自动装箱：Integer d1 = parseInt(str) -> int
        Integer e2 = new Integer(str);//方式2,使用构造器

        //-----------------------Integer和Character常用方法-----------------------
        System.out.println(Integer.MAX_VALUE);//返回最大值,2147483647
        System.out.println(Integer.MIN_VALUE);//返回最小值,-2147483648

        System.out.println(Character.isDigit(1));//判断是否是数字,true
        System.out.println(Character.isLetter('a'));//判断是否是字母,,true
        System.out.println(Character.isUpperCase('A'));//判断字母是否是大写,,true
        System.out.println(Character.isLowerCase('a'));//判断字母是否是大写,,true
        System.out.println(Character.isWhitespace(' '));//判断字母是否是空格,,true
        System.out.println(Character.toUpperCase('a'));//字母转为大写,A
        System.out.println(Character.toLowerCase('A'));//字母转为小写,a

    }
}
